; GO64! TUTORIAL ON 3-D GRAPHICS ; PART 2: ROTATING POINTS ; GO64! 3D-KURS ; TEIL 2: PUNKTE ROTIEREN VICBANK = %00000011; $0000-$4000 V = VICBANK($03*$4000;=$0000 SCREEN = $0400 CHARSET = $0800 XADDLOTB = $2000 XADDHITB = $2080 PIXELTAB = $2100 BASEZP = $02 POINTERS = $00+BASEZP ALPHA = $02+BASEZP BETA = $03+BASEZP GAMMA = $04+BASEZP CURCOORD = $05+BASEZP CRD0BUFL = $06+BASEZP CRD0BUFH = $07+BASEZP CRD1BUFL = $08+BASEZP CRD1BUFH = $09+BASEZP SINBUFLO = $0A+BASEZP SINBUFHI = $0B+BASEZP COSBUFLO = $0C+BASEZP COSBUFHI = $0D+BASEZP ROTBUFLO = $0E+BASEZP ROTBUFHI = $0F+BASEZP FIXPACCU = $10+BASEZP MULTZRPG = $13+BASEZP DIVIDEND = $13+BASEZP DIVISOR = $15+BASEZP X2DCRDFR = $18+BASEZP Y2DCRDFR = $20+BASEZP Z2DCRDFR = $28+BASEZP X2DCORDS = $30+BASEZP Y2DCORDS = $38+BASEZP Z2DCORDS = $40+BASEZP OLDXCRDS = $48+BASEZP OLDYCRDS = $50+BASEZP FOREGNDC = $01 BACKGNDC = $06 XPOS = $0C; MATRIX COORDINATES YPOS = $05; MATRIZENKOORDINATEN ALPHAADD = $02; ANGLE ADD VALUES BETAADD = $07; WINKELADDITIONSWERTE GAMMAADD = $FD *= $4000 SEI LDA #$35 STA $01 LDA #RETURN;NMI STA $FFFB BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #$00 STA $D011 LDA #BACKGNDC STA $D020 STA $D021 ; BUILD TABLES ; TABELLEN GENERIEREN LDA #CHARSET+V LDY #$00 .BYTE $24 MKXADDTB PLA STA XADDLOTB,Y PHA TXA STA XADDHITB,Y INY TYA AND #%00000111 BNE MKXADDTB+0 PLA CLC ADC #$80 BCC *+3 INX CPY #$80 BNE MKXADDTB+1 LDA #%10000000 LDX #$00 MAKPXLTB STA PIXELTAB,X TAY LSR A TYA ROR A INX BPL MAKPXLTB ; CLEAR CHARSET ; ZEICHENSATZ LOESCHEN LDA #CHARSET+V STA POINTERS+1 LDA #$00 LDX #$08 TAY CLEARCHR STA (POINTERS+0),Y INY BNE CLEARCHR INC POINTERS+1 DEX BNE CLEARCHR ; CLEAR SCREEN ; BILDSCHIRM LOESCHEN LDA #$00 TAX STA SCREEN+V+$00,X STA SCREEN+V+$0100,X STA SCREEN+V+$0200,X STA SCREEN+V+$0300,X INX BNE *-13 ; SET UP SCREEN MATRIX ; BILDSCHIRMMATRIX BILDEN CLC LDA #XPOS+(YPOS*$28)+SCREEN+V STA POINTERS+1 LDX #$00 SETUPSCR TXA LDY #$00 STA (POINTERS+0),Y ADC #$10 INY CPY #$10 BNE SETUPSCR+3 LDA #$27 ADC POINTERS+0 STA POINTERS+0 BCC *+4 INC POINTERS+1 INX CPX #$10 BNE SETUPSCR ; SET FOREGROUND COLOUR ; VORDERGRUNDFARBE SETZEN LDA #FOREGNDC LDX #$00 STA $D800,X STA $D900,X STA $DA00,X STA $DB00,X INX BNE *-13 ; SET VIC REGISTERS ; VIC-REGISTER SETZEN BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #%00011011 STA $D011 LDA #%00001000 STA $D016 LDA #SCREEN/$40.(CHARSET/$0400) STA $D018 LDA $DD00 AND #%00000011 ORA #VICBANK STA $DD00 ; RESET ANGLES AND COORDINATES ; KOORDINATEN&WINKEL NULLSETZEN LDA #$00 LDX #NUMPOINT-1 STA OLDXCRDS,X STA OLDYCRDS,X DEX BPL *-5 STA ALPHA STA BETA STA GAMMA ; MAIN LOOP ; HAUPTSCHLEIFE MAINLOOP ; ROTATE COORDINATES ; KOORDINATEN ROTIEREN LDA ALPHA JSR GETSINES ROTATEX STX CURCOORD; ROTATE AROUND X ; UM X ROTIEREN LDA YCOORDS,X STA FIXPACCU+0 STA CRD0BUFH LDA #$00 STA FIXPACCU+2 LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; Y * SIN (ALPHA) STY ROTBUFLO STA ROTBUFHI LDA ZCOORDS,X STA FIXPACCU+0 STA CRD1BUFH LDA #$00 STA FIXPACCU+2 LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; Z * COS (ALPHA) PHA TYA SEC SBC ROTBUFLO STA Y2DCRDFR,X PLA SBC ROTBUFHI ;Y'= Z*COS(ALPHA) STA Y2DCORDS,X; - Y*SIN(ALPHA) LDA CRD1BUFH STA FIXPACCU+0 LDA #$00 STA FIXPACCU+2 LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; Z * SIN (ALPHA) STY ROTBUFLO STA ROTBUFHI LDA CRD0BUFH STA FIXPACCU+0 LDA #$00 STA FIXPACCU+2 LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; Y * COS (ALPHA) PHA TYA CLC ADC ROTBUFLO STA Z2DCRDFR,X PLA ADC ROTBUFHI ;Z'= Y*COS(ALPHA) STA Z2DCORDS,X; + Z*SIN(ALPHA) DEX BPL ROTATEX LDA BETA JSR GETSINES ROTATEY STX CURCOORD; ROTATE AROUND Y ; UM Y ROTIEREN LDA XCOORDS,X STA FIXPACCU+0 STA CRD0BUFH LDA #$00 STA FIXPACCU+2 LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; X * COS (BETA) STY ROTBUFLO STA ROTBUFHI LDA Z2DCORDS,X STA FIXPACCU+0 STA CRD1BUFH LDA Z2DCRDFR,X STA FIXPACCU+2 STA CRD1BUFL LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; Z' * SIN (BETA) PHA TYA CLC ADC ROTBUFLO STA X2DCRDFR,X PLA ADC ROTBUFHI ;X'= Z'*SIN(BETA) STA X2DCORDS,X; + X*COS (BETA) LDA CRD1BUFH STA FIXPACCU+0 LDA CRD1BUFL STA FIXPACCU+2 LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; Z' * COS (BETA) STY ROTBUFLO STA ROTBUFHI LDA CRD0BUFH STA FIXPACCU+0 LDA #$00 STA FIXPACCU+2 LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; X * SIN (BETA) PHA TYA SEC SBC ROTBUFLO STA Z2DCRDFR,X PLA SBC ROTBUFHI ;Z''=X*SIN (BETA) STA Z2DCORDS,X; -Z'*COS(BETA) DEX BPL ROTATEY LDA GAMMA JSR GETSINES ROTATEZ STX CURCOORD; ROTATE AROUND Z ; UM Z ROTIEREN LDA X2DCORDS,X STA FIXPACCU+0 STA CRD0BUFH LDA X2DCRDFR,X STA FIXPACCU+2 STA CRD0BUFL LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; X' * COS (GAMMA) STY ROTBUFLO STA ROTBUFHI LDA Y2DCORDS,X STA FIXPACCU+0 STA CRD1BUFH LDA Y2DCRDFR,X STA FIXPACCU+2 STA CRD1BUFL LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; Y' * SIN (GAMMA) PHA TYA CLC ADC ROTBUFLO STA X2DCRDFR,X PLA ADC ROTBUFHI; X''=Y'*SIN(GAMMA) STA X2DCORDS,X; +X'*COS(GAMMA) LDA CRD1BUFH STA FIXPACCU+0 LDA CRD1BUFL STA FIXPACCU+2 LDA COSBUFLO LDX COSBUFHI JSR MULTIPLY; Y' * COS (GAMMA) STY ROTBUFLO STA ROTBUFHI LDA CRD0BUFH STA FIXPACCU+0 LDA CRD0BUFL STA FIXPACCU+2 LDA SINBUFLO LDX SINBUFHI JSR MULTIPLY; X' * SIN (GAMMA) CPY ROTBUFLO SBC ROTBUFHI ;Y''=X'*SIN(BETA) STA Y2DCORDS,X; -Y'*COS(BETA) DEX BPL ROTATEZ ; CONVERT COORDINATES TO 2-D ; KOORDINATEN NACH 2D WANDELN LDX #NUMPOINT-1 CONVTO2D LDY X2DCRDFR,X LDA X2DCORDS,X JSR PERSPECT STA X2DCORDS,X LDY Z2DCRDFR,X LDA Z2DCORDS,X JSR PERSPECT STA Y2DCORDS,X DEX BPL CONVTO2D ; CLEAR THE OLD POINTS ; DIE ALTEN PUNKTE LOESCHEN BIT $D011 BPL *-3 BIT $D011 BMI *-3 LDA #NUMPOINT-1 CLRPOINT PHA TAX LDA OLDXCRDS,X LDY OLDYCRDS,X TAX LDA XADDLOTB,X STA POINTERS+0 LDA XADDHITB,X STA POINTERS+1 LDA #$FF EOR PIXELTAB,X AND (POINTERS+0),Y STA (POINTERS+0),Y PLA SEC SBC #$01 BPL CLRPOINT ; PUT THE ROTATED POINTS ; DIE ROTIERTEN PUNKTE SETZEN LDA #NUMPOINT-1 PUTPOINT PHA TAX LDA X2DCORDS,X STA OLDXCRDS,X LDY Y2DCORDS,X STY OLDYCRDS,X TAX LDA XADDLOTB,X STA POINTERS+0 LDA XADDHITB,X STA POINTERS+1 LDA PIXELTAB,X ORA (POINTERS+0),Y STA (POINTERS+0),Y PLA SEC SBC #$01 BPL PUTPOINT ; ADVANCE ANGLES ; WINKEL ERHOEHEN CLC LDA #ALPHAADD ADC ALPHA STA ALPHA CLC LDA #BETAADD ADC BETA STA BETA CLC LDA #GAMMAADD ADC GAMMA STA GAMMA JMP MAINLOOP ; GET SINE/COSINE VALUES ; SINUS-/KOSINUSWERTE HOLEN GETSINES TAX LDA SINCOSLO,X STA SINBUFLO LDA SINCOSHI,X STA SINBUFHI CLC TXA ADC #$40 TAX LDA SINCOSLO,X STA COSBUFLO LDA SINCOSHI,X STA COSBUFHI LDX #NUMPOINT-1 RTS ; MULTIPLY WITH SIN/COS ; MIT SIN/COS MULTIPLIZIEREN MULTIPLY LDY #$00 STY FIXPACCU+$01 STY MULTZRPG+1 STY MULTZRPG+2 CPX #$00 BEQ *+8 CLC EOR #$FF ADC #$01 DEY STA MULTZRPG+0 BIT FIXPACCU+$00 BPL *+16 SEC LDA #$00 SBC FIXPACCU+$02 STA FIXPACCU+$02 LDA #$00 SBC FIXPACCU+$00 STA FIXPACCU+$00 INY STY MULTZRPG+3 LDA #$00 LDX #$08 TAY MULTLOOP LSR MULTZRPG+0 BCC NOMULTAD CLC LDA FIXPACCU+$02 ADC MULTZRPG+1 STA MULTZRPG+1 TYA ADC FIXPACCU+$00 TAY LDA FIXPACCU+$01 ADC MULTZRPG+2 STA MULTZRPG+2 NOMULTAD ASL FIXPACCU+$02 ROL FIXPACCU+$00 ROL FIXPACCU+$01 DEX BNE MULTLOOP LDX MULTZRPG+3 BEQ NONEGRSL TAX TYA CLC EOR #$FF ADC #$01 TAY TXA EOR #$FF ADC #$00 NONEGRSL LDX CURCOORD RTS ;PERFORM PERSPECTIVE DIVISION ;PERSPEKTIVDIVISION VOLLFUEHREN PERSPECT PHA BPL NONEGCRD PHA TYA CLC EOR #$FF ADC #$01 TAY PLA EOR #$FF ADC #$00 NONEGCRD STA DIVIDEND+0 STY DIVIDEND+1 CLC LDA #$4E; ONLY POSITIVE DEPTH ; VALUES ; NUR POSITIVE TIEFEN- ; WERTE ADC Y2DCORDS,X STA DIVISOR+0 LDY #$00 STY DIVISOR+1 INY STY DIVISOR+2 SEC DIVLOOP ROR DIVISOR+0 ROR DIVISOR+1 SEC LDA DIVIDEND+1 SBC DIVISOR+1 TAY LDA DIVIDEND+0 SBC DIVISOR+0 BCC *+6 STA DIVIDEND+0 STY DIVIDEND+1 ROL DIVISOR+2 BCC DIVLOOP PLA ASL A LDA DIVISOR+2 BCC *+4 EOR #$FF ADC #$40;ORIGIN IS AT ($40;$40) ;URSPRUNG BEI ($40;$40) RTS NMI RTI ; POINT COORDINATES ; PUNKTKOORDINATEN XCOORDS .BYTE $D4,$2C,$D4,$2C .BYTE $D4,$2C,$D4,$2C YCOORDS .BYTE $D4,$D4,$2C,$2C .BYTE $D4,$D4,$2C,$2C ZCOORDS .BYTE $D4,$D4,$D4,$D4 .BYTE $2C,$2C,$2C,$2C ; SINE/COSINE TABLE ; SINUS-/KOSINUSTABELLE *= *&$FF00+$0100 SINCOSLO .BYTE $00,$06,$0D,$13,$19,$1F .BYTE $25,$2C,$32,$38,$3E,$44 .BYTE $4A,$50,$56,$5C,$62,$67 .BYTE $6D,$73,$78,$7E,$83,$88 .BYTE $8E,$93,$98,$9D,$A2,$A7 .BYTE $AB,$B0,$B4,$B9,$BD,$C1 .BYTE $C5,$C9,$CD,$D0,$D4,$D7 .BYTE $DB,$DE,$E1,$E4,$E7,$E9 .BYTE $EC,$EE,$F0,$F2,$F4,$F6 .BYTE $F7,$F9,$FA,$FB,$FC,$FD .BYTE $FE,$FE,$FF,$FF,$FF,$FF .BYTE $FF,$FE,$FE,$FD,$FC,$FB .BYTE $FA,$F9,$F7,$F6,$F4,$F2 .BYTE $F0,$EE,$EC,$E9,$E7,$E4 .BYTE $E1,$DE,$DB,$D7,$D4,$D0 .BYTE $CD,$C9,$C5,$C1,$BD,$B9 .BYTE $B4,$B0,$AB,$A7,$A2,$9D .BYTE $98,$93,$8E,$88,$83,$7E .BYTE $78,$73,$6D,$67,$62,$5C .BYTE $56,$50,$4A,$44,$3E,$38 .BYTE $32,$2C,$25,$1F,$19,$13 .BYTE $0D,$06,$00,$FA,$F3,$ED .BYTE $E7,$E1,$DB,$D4,$CE,$C8 .BYTE $C2,$BC,$B6,$B0,$AA,$A4 .BYTE $9E,$99,$93,$8D,$88,$82 .BYTE $7D,$78,$72,$6D,$68,$63 .BYTE $5E,$59,$55,$50,$4C,$47 .BYTE $43,$3F,$3B,$37,$33,$30 .BYTE $2C,$29,$25,$22,$1F,$1C .BYTE $19,$17,$14,$12,$10,$0E .BYTE $0C,$0A,$09,$07,$06,$05 .BYTE $04,$03,$02,$02,$01,$01 .BYTE $01,$01,$01,$02,$02,$03 .BYTE $04,$05,$06,$07,$09,$0A .BYTE $0C,$0E,$10,$12,$14,$17 .BYTE $19,$1C,$1F,$22,$25,$29 .BYTE $2C,$30,$33,$37,$3B,$3F .BYTE $43,$47,$4C,$50,$55,$59 .BYTE $5E,$63,$68,$6D,$72,$78 .BYTE $7D,$82,$88,$8D,$93,$99 .BYTE $9E,$A4,$AA,$B0,$B6,$BC .BYTE $C2,$C8,$CE,$D4,$DB,$E1 .BYTE $E7,$ED,$F3,$FA SINCOSHI .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$00,$00,$00 .BYTE $00,$00,$00,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF,$FF,$FF .BYTE $FF,$FF,$FF,$FF NUMPOINT = YCOORDS-XCOORDS RETURN SEI LDA #$37 STA $01 LDX #$FF TXS JSR $FDA3 LDA #$00 TAY STA $02,Y INY BNE *-4 LDX #$3C LDY #$03 STX $B2 STY $B3 LDX #$00 LDY #$A0 JSR $FD8C JSR $FD15 JSR $FF5B JSR $E3BF LDA #$08 STA $BA JMP $9000